package $13_mutiple;
/*多态前提：
1.必须有继承或实现关系
2.必须有方法重写
3.必须有父类引用指向子类对象
好处：提高方法的灵活性
如果一个方法中使用父类或父接口作为形式参数，将来调用该方法时，可以传递任意的子类对象！*/
/*

Java 中父类引用指向子类对象的一个主要原因是实现多态性。
多态性是面向对象编程的重要概念之一，它允许以统一的方式处理不同类型的对象。通过使用父类引用指向子类对象，可以在不关
心具体子类类型的情况下，对这些对象进行统一的操作。
具体来说，当一个父类引用指向子类对象时，可以通过该父类引用调用父类中定义的方法，也可以通过方法重写的方式，根据子类
的实现调用相应的方法。
使用父类引用指向子类对象还有其他几个好处：
多态性增加了代码的灵活性和可维护性。当需要新增加一个子类时，只需要添加新的子类，而不需要修改现有的代码。
提高了代码的可扩展性。通过父类引用指向子类对象，可以方便地将代码抽象化，减少了对具体子类的依赖。
实现了接口和抽象类的多态性。接口和抽象类可以定义一系列共同的方法，然后通过父类引用指向不同的子类对象，实现了接口和
抽象类的多态性。
需要注意的是，父类引用指向子类对象时，无法访问子类独有的方法和属性，除非进行类型转换。
总之，Java 中父类引用指向子类对象的好处在于实现多态性，提高代码的灵活性、可维护性和可扩展性。这是面向对象编程中重
要的特性之一。

 */
public class Test 
{
	public static void main(String[]args)
	{
		/*//1.父类引用指向子类对象（啥意思？）
		Animal a = new Dog(); //   左:父类引用 = 右：子类对象
		a.shout();*/
		
		
		/*//2.创建对象来调用shout方法
		Dog d = new Dog();
		useDog(d);//接收d对象使用
		Cat c = new Cat();
		useCat(c);//接收c对象使用*/
		
		
		//3.创建对象来调用方法
		Dog d2 = new Dog();
		useAnimal(d2);
		Cat c2 = new Cat();
		useAnimal(c2);
		
		
	}
	/*//2.可以使用Dog类中方法的方法（需要接收Dog类的对象）
	public static void useDog(Dog dog)
	{
		dog.shout();
	}
	//2.可以使用Cat类中方法的方法（需要接收Dog类的对象）
	public static void useCat(Cat cat)
	{
		cat.shout();
	}*/
	
	
	//3.通用的方法（可以接收任意的子类对象）
	public static void useAnimal(Animal ani)
	{
		ani.shout();
	}
	
}




abstract class Animal
{
	public abstract void shout();
}


class Dog extends Animal
{
	//shout()重写
	public void shout()
	{
		System.out.println("汪汪汪");
	}
}


class Cat extends Animal
{
	//shout()重写
	public void shout()
	{
		System.out.println("喵喵喵");
	}
}



